﻿using System;
using System.Collections;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;

namespace VMExplorer.Forms
{
  public partial class ProcessList : Form
  {
    public int Id;
    private ListViewColumnSorter lvwColumnSorter;

    public ProcessList()
    {
      InitializeComponent();


      Process [] processes = Process.GetProcesses ();
      foreach (Process p in processes)
      {
        ListViewItem lvi = new ListViewItem (new string [] { p.Id.ToString(), p.ProcessName });
        lvi.Tag = p.Id;

        listView1.Items.Add (lvi);
      }

      // Create an instance of a ListView column sorter and assign it 
      // to the ListView control.
      lvwColumnSorter = new ListViewColumnSorter ();
      lvwColumnSorter.SortColumn = 1;
      lvwColumnSorter.Order = SortOrder.Ascending;

      listView1.ListViewItemSorter = lvwColumnSorter;

      // Perform the sort with these new sort options.
      listView1.Sort ();

      // Loop through and size each column header to fit the column header text.
      foreach (ColumnHeader ch in listView1.Columns)
      {
        ch.Width = -2;
      }

    }

    private void listView1_ColumnClick (object sender, ColumnClickEventArgs e)
    {
      // Determine if clicked column is already the column that is being sorted.
      if (e.Column == lvwColumnSorter.SortColumn)
      {
        // Reverse the current sort direction for this column.
        if (lvwColumnSorter.Order == SortOrder.Ascending)
        {
          lvwColumnSorter.Order = SortOrder.Descending;
        }
        else
        {
          lvwColumnSorter.Order = SortOrder.Ascending;
        }
      }
      else
      {
        // Set the column number that is to be sorted; default to ascending.
        lvwColumnSorter.SortColumn = e.Column;
        lvwColumnSorter.Order = SortOrder.Ascending;
      }

      // Perform the sort with these new sort options.
      listView1.Sort ();
    }

    private void listView1_DoubleClick (object sender, EventArgs e)
    {
      ListViewItem lvi = null;
      try
      {
        lvi = listView1.SelectedItems [0];
      }
      catch
      {
      }

      if (lvi == null) return;

      Id = (int)lvi.Tag;
      _btnOK.PerformClick ();
    }

    private void listView1_SelectedIndexChanged (object sender, EventArgs e)
    {
      if (listView1.SelectedItems.Count > 0)
      {
        ListViewItem lvi = listView1.SelectedItems [0];
        Id = (int)lvi.Tag;
        _btnOK.Enabled = true;
      }
      else
      {
        _btnOK.Enabled = false;
        Id = -1;
      }
    }
  }

  class ListViewColumnSorter : IComparer
  {
    /// <summary>
    /// Specifies the column to be sorted
    /// </summary>
    private int ColumnToSort;
    /// <summary>
    /// Specifies the order in which to sort (i.e. 'Ascending').
    /// </summary>
    private SortOrder OrderOfSort;
    /// <summary>
    /// Case insensitive comparer object
    /// </summary>
    private CaseInsensitiveComparer ObjectCompare;

    /// <summary>
    /// Class constructor.  Initializes various elements
    /// </summary>
    public ListViewColumnSorter ()
    {
      // Initialize the column to '0'
      ColumnToSort = 0;

      // Initialize the sort order to 'none'
      OrderOfSort = SortOrder.None;

      // Initialize the CaseInsensitiveComparer object
      ObjectCompare = new CaseInsensitiveComparer ();
    }

    /// <summary>
    /// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
    /// </summary>
    /// <param name="x">First object to be compared</param>
    /// <param name="y">Second object to be compared</param>
    /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
    public int Compare (object x, object y)
    {
      int compareResult;
      ListViewItem listviewX, listviewY;

      // Cast the objects to be compared to ListViewItem objects
      listviewX = (ListViewItem)x;
      listviewY = (ListViewItem)y;

      // Compare the two items
      compareResult = ObjectCompare.Compare (listviewX.SubItems [ColumnToSort].Text, listviewY.SubItems [ColumnToSort].Text);

      // Calculate correct return value based on object comparison
      if (OrderOfSort == SortOrder.Ascending)
      {
        // Ascending sort is selected, return normal result of compare operation
        return compareResult;
      }
      else if (OrderOfSort == SortOrder.Descending)
      {
        // Descending sort is selected, return negative result of compare operation
        return (-compareResult);
      }
      else
      {
        // Return '0' to indicate they are equal
        return 0;
      }
    }

    /// <summary>
    /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
    /// </summary>
    public int SortColumn
    {
      set
      {
        ColumnToSort = value;
      }
      get
      {
        return ColumnToSort;
      }
    }

    /// <summary>
    /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
    /// </summary>
    public SortOrder Order
    {
      set
      {
        OrderOfSort = value;
      }
      get
      {
        return OrderOfSort;
      }
    }

  }

}
